package com.system.base.pay;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.lg.entity.User;
import com.lg.service.UserService;
import com.system.base.ApiResult;

import lombok.extern.slf4j.Slf4j;

/**
 * 付款模板方法 暂时简化
 * 
 * @author kaifa002
 *
 */
@SuppressWarnings("rawtypes")
@Slf4j
@Component
public abstract class AbstractPayTemplate {

	@Autowired
	UserService userService;
	
	/**
	 * 支付方法
	 *
	 * @return
	 */
	public abstract ApiResult pay(Map<String, String> params);

	/**
	 * 封装数据
	 */
	public abstract void packageData(Map<String, String> params);

	/**
	 * 为了防止恶意的操作，一般模板方法都加上final关键字，不允许被覆写。
	 */
	public final ApiResult run(Map<String, String> params) {
		// 封装数据
		this.packageData(params);
		// 去支付
		ApiResult apiResult = this.pay(params);
		return apiResult;
	}
	
	
	/**
	 * 为了防止恶意的操作，一般模板方法都加上final关键字，不允许被覆写。
	 * @throws Exception 
	 */
	public final String notifyUrl(Map<String, String> params) throws Exception {
		
		// 支付回调日志
		savePayNotifyLog(params);
		// 验签
		this.signature(params);
		
		String signature = params.get("signature");
		// 验签失败或支付失败
		if (!signature.equals("200")) {
			return retFail();
		}
		// 去执行其他事务
		this.doSomeThing(params);
		return retSuccess();
	}

	protected void savePayNotifyLog(Map<String, String> params) {
		log.info("===>savePayNotifyLog保存回调日志,{}", params);
	}
	
	public abstract void signature(Map<String, String> params) throws Exception;
	
	private void doSomeThing(Map<String, String> params) throws Exception {
		log.info("===>doSomeThing支付成功，处理业务！");
		List<User> userList = userService.listUser();
		userList.forEach(System.out::println);
	}
	
	public String retSuccess() {
		return "success";
	}

	public String retFail() {
		return "fail";
	}
	

}
